//  c1 - c4
//  |base|
//  |    |
//  c3 - c2
#define OUTER_BASE_PARTS(w, h)               \
   part { name: "base"; type: SPACER;        \
      description {                          \
         state: "default" 0.0; } }           \
   part { name: "c1"; type: SPACER;          \
      description { state: "default" 0.0;    \
         rel1.to: "base";                    \
         rel2.to: "base";                    \
         rel2.relative: 0 0;                 \
         align: 1 1;                         \
         min: w h;                           \
         max: w h; } }                       \
   part { name: "c3"; type: SPACER;          \
      description { state: "default" 0.0;    \
         rel1.to: "base";                    \
         rel2.to: "base";                    \
         rel1.relative: 0 1;                 \
         rel2.relative: 0 1;                 \
         align: 1 0;                         \
         min: w h;                           \
         max: w h; } }                       \
   part { name: "c4"; type: SPACER;          \
      description { state: "default" 0.0;    \
         rel1.to: "base";                    \
         rel2.to: "base";                    \
         rel1.relative: 1 0;                 \
         rel2.relative: 1 0;                 \
         min: w h;                           \
         max: w h; } }                       \
   part { name: "c2"; type: SPACER;          \
      mouse_events: 0;                       \
      description { state: "default" 0.0;    \
         rel1.to: "base";                    \
         rel1.relative: 1 1;                 \
         rel2.to: "base";                    \
         rel2.relative: 1 1;                 \
         align: 0 0;                         \
         min: w h;                           \
         max: w h; } }

collections {
   group { name: "elm/focus_highlight/top/glow";
      images {
         image: "border6.png" COMP;
      }
      data.item: "animate" "on";

      script {
         public src_x, src_y, src_w, src_h;
         public diffx, diffy, diffw, diffh;
         public anim_highlight(val, Float:pos) {
            new x, y, w, h, dx, dy, dw, dh;

            dx = round(float_mul(float(get_int(diffx)), pos));
            x = get_int(src_x) + dx;
            dy = round(float_mul(float(get_int(diffy)), pos));
            y = get_int(src_y) + dy;
            dw = round(float_mul(float(get_int(diffw)), pos));
            w = get_int(src_w) + dw;
            dh = round(float_mul(float(get_int(diffh)), pos));
            h = get_int(src_h) + dh;

            update_offset(x, y, w, h);

            if(pos >= 1.0) {
               emit("elm,action,focus,anim,end", "");
               set_state(PART:"highlight", "default", 0.0);
            }
         }
         public update_offset(x, y, w, h) {
            set_state_val(PART:"base", STATE_REL1_OFFSET, x, y);
            set_state_val(PART:"base", STATE_REL2_OFFSET, x + w, y + h);
         }
         public message(Msg_Type:type, id, ...) {
            if((type == MSG_INT_SET) && (id == 1)) {
               new x1, y1, w1, h1, x2, y2, w2, h2;

               x1 = getarg(2);
               y1 = getarg(3);
               w1 = getarg(4);
               h1 = getarg(5);
               x2 = getarg(6);
               y2 = getarg(7);
               w2 = getarg(8);
               h2 = getarg(9);

               set_int(src_x, x1);
               set_int(src_y, y1);
               set_int(src_w, w1);
               set_int(src_h, h1);
               set_int(diffx, x2 - x1);
               set_int(diffy, y2 - y1);
               set_int(diffw, w2 - w1);
               set_int(diffh, h2 - h1);

               custom_state(PART:"base", "default", 0.0);
               set_state_val(PART:"base", STATE_REL1, 0.0, 0.0);
               set_state_val(PART:"base", STATE_REL2, 0.0, 0.0);
               update_offset(x1, y1, w1, h1);
               set_state(PART:"base", "custom", 0.0);
               anim(0.2, "anim_highlight", 0);
            }
         }
      } //script ends
      parts {
         OUTER_BASE_PARTS(12, 12);
         part { name: "highlight"; type: IMAGE;
            mouse_events: 0;
            description { state: "default" 0.0;
               image.normal: "border6.png";
               image.border: 20 20 20 20;
               rel1.to: "c1";
               rel2.to: "c2";
            }
            description { state: "visible" 0.0;
               inherit: "default" 0.0;
              }
            description { state: "invisible" 0.0;
               inherit: "default" 0.0;
               visible: 0;
            }
         }
      } //parts ends
      programs {
         program { name: "show";
            signal: "elm,action,focus,show";
            source: "elm";
            action: ACTION_STOP;
            target: "hide";
            target: "hide_start";
            target: "hide_end";
            after: "show_start";
         }
         program { name: "show_start";
            action: STATE_SET "visible" 0.0;
            transition: SIN 0.2;
            target: "highlight";
            after: "show_end";
         }
         program { name: "show_end";
            action: SIGNAL_EMIT "elm,action,focus,show,end" "";
         }
         program { name: "hide";
            signal: "elm,action,focus,hide";
            source: "elm";
            action: ACTION_STOP;
            target: "show";
            target: "show_start";
            target: "show_end";
            after: "hide_start";
         }
         program { name: "hide_start";
            action: STATE_SET "invisible" 0.0;
            transition: SIN 0.2;
            target: "highlight";
            after: "hide_end";
         }
         program { name: "hide_end";
            action: SIGNAL_EMIT "elm,action,focus,hide,end" "";
         }
      } //programs ends
   } //group ends

   group { name: "elm/focus_highlight/top/glow_effect";
      inherit: "elm/focus_highlight/top/glow";
      images {
         image: "border.png" COMP;
         image: "border2.png" COMP;
         image: "border3.png" COMP;
         image: "border4.png" COMP;
         image: "border5.png" COMP;
         image: "border6.png" COMP;
      }
      data.item: "animate" "on";

      script {
         public src_x, src_y, src_w, src_h;
         public diffx, diffy, diffw, diffh;
         public anim_highlight(val, Float:pos) {
            new x, y, w, h, dx, dy, dw, dh, Float:p;
            p = 1.0 - ((1.0 - pos) * (1.0 - pos) * (1.0 - pos));

            dx = round(float_mul(float(get_int(diffx)), p));
            x = get_int(src_x) + dx;
            dy = round(float_mul(float(get_int(diffy)), p));
            y = get_int(src_y) + dy;
            dw = round(float_mul(float(get_int(diffw)), p));
            w = get_int(src_w) + dw;
            dh = round(float_mul(float(get_int(diffh)), p));
            h = get_int(src_h) + dh;

            update_offset(x, y, w, h);

            if(pos >= 1.0) {
               emit("elm,action,focus,anim,end", "");
               set_state(PART:"highlight", "default", 0.0);
               emit("dim", "");
            }
         }
         public update_offset(x, y, w, h) {
            set_state_val(PART:"base", STATE_REL1_OFFSET, x, y);
            set_state_val(PART:"base", STATE_REL2_OFFSET, x + w, y + h);
         }
         public message(Msg_Type:type, id, ...) {
            if((type == MSG_INT_SET) && (id == 1)) {
               new x1, y1, w1, h1, x2, y2, w2, h2;

               x1 = getarg(2);
               y1 = getarg(3);
               w1 = getarg(4);
               h1 = getarg(5);
               x2 = getarg(6);
               y2 = getarg(7);
               w2 = getarg(8);
               h2 = getarg(9);

               set_int(src_x, x1);
               set_int(src_y, y1);
               set_int(src_w, w1);
               set_int(src_h, h1);
               set_int(diffx, x2 - x1);
               set_int(diffy, y2 - y1);
               set_int(diffw, w2 - w1);
               set_int(diffh, h2 - h1);

               custom_state(PART:"base", "default", 0.0);
               set_state_val(PART:"base", STATE_REL1, 0.0, 0.0);
               set_state_val(PART:"base", STATE_REL2, 0.0, 0.0);
               update_offset(x1, y1, w1, h1);
               set_state(PART:"base", "custom", 0.0);
               anim(0.2, "anim_highlight", 0);
            }
         }
      } //script ends
      parts {
         part { name: "highlight"; type: IMAGE;
            mouse_events: 0;
            description { state: "default" 0.0;
               image.normal: "border6.png";
               image.border: 16 16 16 16;
               rel1.to: "c1";
               rel2.to: "c2";
               visible: 1;
            }
            description { state: "visible" 0.0;
               inherit: "default" 0.0;
            }
            description { state: "visible" 0.1;
               inherit: "visible" 0.0;
               image.normal: "border2.png";
               image.border: 18 18 18 18;
            }
            description { state: "visible" 0.2;
               inherit: "visible" 0.0;
               image.normal: "border3.png";
               image.border: 19 19 19 19;
            }
            description { state: "visible" 0.3;
               inherit: "visible" 0.0;
               image.normal: "border4.png";
               image.border: 20 20 20 20;
            }
            description { state: "visible" 0.4;
               inherit: "visible" 0.0;
               image.normal: "border5.png";
               image.border: 21 21 21 21;
            }
            description { state: "visible" 0.5;
               inherit: "visible" 0.0;
               image.normal: "border6.png";
               image.border: 25 25 25 25;
            }
            description { state: "invisible" 0.0;
               inherit: "default" 0.0;
               visible: 0;
            }
         }
      }//parts ends
      programs {
         program { name: "show";
            signal: "elm,action,focus,show";
            source: "elm";
            action: ACTION_STOP;
            target: "hide";
            target: "hide_start";
            target: "hide_end";
            after: "show_start";
         }
         program { name: "show_start";
            action: SIGNAL_EMIT "dim" "";
            after: "show_end";
         }
         program { name: "dim_start";
            signal: "dim";
            in: 2 0.4;
            source: "";
            action: STATE_SET "visible" 0.4;
            transition: SINUSOIDAL 0.2;
            target: "highlight";
            after: "dim1";
         }
         program { name: "dim1";
            action: STATE_SET "visible" 0.3;
            transition: SINUSOIDAL 0.2;
            target: "highlight";
            after: "dim2";
         }
         program { name: "dim2";
            action: STATE_SET "visible" 0.2;
            transition: SINUSOIDAL 0.2;
            target: "highlight";
            after: "dim3";
         }
         program { name: "dim3";
            action: STATE_SET "visible" 0.1;
            transition: SINUSOIDAL 0.2;
            target: "highlight";
            after: "dim_end";
         }
         program { name: "dim_end";
            action: SIGNAL_EMIT "glow" "";
         }
         program { name: "glow_start";
            signal: "glow";
            source: "";
            in: 1 0.4;
            action: STATE_SET "visible" 0.0;
            transition: SINUSOIDAL 0.2;
            target: "highlight";
            after: "glow1";
         }
         program { name: "glow1";
            action: STATE_SET "visible" 0.1;
            transition: SINUSOIDAL 0.2;
            target: "highlight";
            after: "glow2";
         }
         program { name: "glow2";
            action: STATE_SET "visible" 0.2;
            transition: SINUSOIDAL 0.2;
            target: "highlight";
            after: "glow3";
         }
         program { name: "glow3";
            action: STATE_SET "visible" 0.3;
            transition: SINUSOIDAL 0.2;
            target: "highlight";
            after: "glow4";
         }
         program { name: "glow4";
            action: STATE_SET "visible" 0.4;
            transition: SINUSOIDAL 0.2;
            target: "highlight";
            after: "glow5";
         }
         program { name: "glow5";
            action: STATE_SET "visible" 0.5;
            transition: SINUSOIDAL 0.2;
            target: "highlight";
            after: "glow1";
         }
         program { name: "show_end";
            action: SIGNAL_EMIT "elm,action,focus,show,end" "";
         }
         program { name: "hide";
            signal: "elm,action,focus,hide";
            source: "elm";
            action: ACTION_STOP;
            target: "show";
            target: "show_start";
            target: "show_end";
            after: "hide_start";
         }
         program { name: "hide_start";
            action: STATE_SET "invisible" 0.0;
            transition: LIN 0.2;
            target: "highlight";
            after: "hide_end";
         }
         program { name: "hide_end";
            action: SIGNAL_EMIT "elm,action,focus,hide,end" "";
         }
      } //programs ends
   } //group ends

   group { name: "elm/layout/focus/example";
      data.item: "focus_part" "focus_area";
      parts {
         part { name: "bg"; type: RECT;
            scale: 1;
            description { state: "default" 0.0;
               color: 255 255 0 255;
               min: 150 40;
               max: 150 40;
            }
         }
         part { name: "elm.text"; type: TEXT;
            scale: 1;
            description { state: "default" 0.0;
               rel1.to: "bg";
               rel2.to: "bg";
               text.text: "layout";
               text.size: 9;
               color: 0 0 0 255;
            }
         }
         part { name: "focus_area"; type: RECT;
            scale: 1;
            description { state: "default" 0.0;
               rel1.to: "bg";
               rel2.to: "bg";
               rel2.relative: 0 0;
               align: 0 0;
               min: 60 30;
               max: 60 30;
               fixed: 1 1;
               color: 125 125 125 125;
            }
         }
         part { name: "elm.text1"; type: TEXT;
            scale: 1;
            description { state: "default" 0.0;
               rel1.to: "focus_area";
               rel2.to: "focus_area";
               text.text: "focus_part";
               text.size: 9;
               color: 255 0 255 255;
            }
         }
      }
   } //group ends

#include "../../../data/elementary/themes/snd.edc"
#include "../../../data/elementary/themes/ic.edc"
#include "../../../data/elementary/themes/macros.edc"
#include "../../../data/elementary/themes/fonts.edc"
#include "../../../data/elementary/themes/colorclasses.edc"

// to customize check default style
#include "../../../data/elementary/themes/edc/elm/check.edc"
   group { name: "elm/check/base/focus_text";
      data.item: "focus_part" "elm.text";
      inherit: "elm/check/base/default";
   }

// to customize button default style
#include "../../../data/elementary/themes/edc/elm/button.edc"
   group { name: "elm/button/base/focus_icon";
      data.item: "focus_part" "elm.swallow.content";
      inherit: "elm/button/base/default";
   }
}
